package main

import (
	"fmt"
	"reflect"
)

/*1、全局变量的作用域是从定义的那一行开始, 直到文件末尾为止

2、全局变量, 只要程序一启动就会分配存储空间, 只有程序关闭才会释放存储空间,

3、全局变量存储在静态区(数据区)*/
var str string //全局变量 ：函数外面的就是全局变量

func sum(nums ...int) { //不定长参数,变参函数,注意：可变参数通常要作为函数的最后一个参数。
	fmt.Println(nums, " ")
	fmt.Println(reflect.TypeOf(nums))
	total := 0
	for _, num := range nums {
		total += num
	}
	fmt.Println(total)
}

//7.4.4、返回值命名
func calc(x, y int) (sum, sub int) {
	//sum =
	//sub =
	return x + y, x - y //  return sum sub
}

func main() {
	/*局部变量 ：写在{}中或者函数中或者函数的形参, 都是局部变量
		1、局部变量的作用域是从定义的那一行开始, 直到遇到 } 结束或者遇到return为止

	2、局部变量, 只有执行了才会分配存储空间, 只要离开作用域就会自动释放

	3、局部变量存储在栈区

	4、局部变量如果没有使用, 编译会报错。全局变量如果没有使用, 编译不会报错

	5、:=只能用于局部变量, 不能用于全局变量*/

	//Go语言中所有的传参都是值传递（传值），都是一个副本，一个拷贝。因为拷贝的内容有时候是非引用类型（int、string、struct等这些），这样就在函数中就无法修改原内容数据；有的是引用类型（指针、map、slice、chan等这些），这样就可以修改原内容数据。

	sum(1, 2)
	sum(1, 2, 3)

	nums := []int{1, 2, 3, 4}
	sum(nums...)

	v, _ := calc(10, 6)
	fmt.Println(v)
	fmt.Println(str + "aaa")
}
